/**
 * <p>文件名:		Framework.java</p>
 * <p>版权:		CopyrightTag</p>
 * <p>公司:		CompanyTag</p>
 * @author		周华彬(zhouhuabin@ctfo.com)
 */

package com.caits.lbs.framework;

import java.util.Calendar;
import java.util.concurrent.Executors;

import org.apache.logging.log4j.Logger;
import org.junit.runner.JUnitCore;
import org.junit.runner.Request;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.caits.lbs.framework.log.CommonLogFactory;
import com.caits.lbs.framework.utils.SystemUtils;

/**
 * <p>
 * Framework
 * </p>
 * <p>
 * 框架辅助类
 * </p>
 * 
 * @author 周华彬(zhouhuabin@ctfo.com)
 * @version 0.0.0
 *          <table style="border:1px solid gray;">
 *          <tr>
 *          <th width="100px">版本号</th><th width="100px">动作</th><th
 *          width="100px">修改人</th><th width="100px">修改时间</th>
 *          </tr>
 *          <!-- 以 Table 方式书写修改历史 -->
 *          <tr>
 *          <td>0.0.0</td>
 *          <td>创建类</td>
 *          <td>周华彬</td>
 *          <td>2008-8-22 下午02:08:10</td>
 *          </tr>
 *          <tr>
 *          <td>XXX</td>
 *          <td>XXX</td>
 *          <td>XXX</td>
 *          <td>XXX</td>
 *          </tr>
 *          </table>
 */
public class Framework {

	/**
	 * FIXME 当前框架处于调试模式，那么输出的日志就会包含具体的内容信息，如果非debug模式，那么就不输出内部值，使用最高性能输出最关键的数据<br>
	 * 当true的时候平均比false的时候快50倍，所以推荐在调试时使用true，稳定发布后改为false
	 */
	public static boolean Debug = true;
	
	protected static  Logger log = null;
	/** 启动上下文 */
	public static ClassPathXmlApplicationContext context;

	public static void startApplicationContext(String ... configLocation){
		Calendar cal = Calendar.getInstance();
		long l_start = cal.getTimeInMillis();
		if (context == null) {
			context = new ClassPathXmlApplicationContext(configLocation);
			context.start();
			log = CommonLogFactory.getLog();
		} else {
			log.info("上下文环境已经启动");
		}
		log.info("系统启动花费" + (cal.getTimeInMillis() - l_start)	+ "ms");
		SystemUtils.printSystemMemory(null, log);
	}
	/**
	 * 构造器
	 */
	public Framework() {

	}

	/**
	 * FIXME
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		Debug = false;
		startApplicationContext("application*.xml");
		if(context!=null){
			log.info("实例装载成功.");
			CommonLogFactory.getErrdatalog().info("实例装载成功.");
		}
	}
	/**
	 * 运行一组测试类
	 * 
	 * @param sync
	 *            是否同步调用
	 * @param classes
	 *            待测试的junit类
	 */
	public static void runJunitClass(boolean sync, final Class<?>... classes) {
		if (sync)
			JUnitCore.runClasses(classes);
		else
			Executors.newSingleThreadExecutor().execute(new Runnable() {
				public void run() {
					JUnitCore.runClasses(classes);
				}
			});
	}

	/**
	 * 运行一个测试类的某些方法 必须是无参数的，可以无注解@Test
	 * 
	 * @param sync
	 *            是否同步调用
	 * @param clazz
	 *            待测试的junit类
	 * @param methodName
	 *            待测试的方法名称,无参数的方法
	 */
	public static void runJunitMethod(boolean sync, final Class<?> clazz, final String... methodNameArr) {
		// 同步调用
		if (sync)
			for (String methodName : methodNameArr)
				new JUnitCore().run(Request.method(clazz, methodName));
		// 异步调用
		else
			Executors.newSingleThreadExecutor().execute(new Runnable() {
				public void run() {
					for (String methodName : methodNameArr)
						new JUnitCore().run(Request.method(clazz, methodName));
				}
			});

	}
}
